package com.saer.server.network.logica.mensajes;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;

import com.saer.server.network.electro.Electrocardiograma;
import com.saer.server.network.electro.Muestra;
import com.saer.server.network.electro.Toma;
import com.saer.server.network.logica.Enfermero;
import com.saer.server.network.logica.Paciente;
import com.saer.server.network.red.MsjNotForMeException;

public class MensajeDatos extends Mensaje {

	private Enfermero enfermero;
	private Paciente paciente; // Contiene "Vista Previa Mensaje"
	private Electrocardiograma electro;

	// Constructores

	public MensajeDatos(int id_msj, int id_origen, String cuerpo,
			Enfermero enfermero, Paciente paciente, Electrocardiograma electro) {

		this.id_msj = id_msj;
		this.id_origen = id_origen;
		this.cuerpo = cuerpo;
		this.enfermero = enfermero;
		this.paciente = paciente;
		this.electro = electro;
		this.tipo = "DATO";
	}

	public MensajeDatos(int id_msj, int id_origen, String cuerpo,
			InetAddress ip_origen) {
		super();
		this.id_msj = id_msj;
		this.id_origen = id_origen;
		this.cuerpo = cuerpo;
		this.tipo = "DATO";
	}

	// Enfermero, Paciente, Electro

	public MensajeDatos() {
		enfermero = new Enfermero();
		paciente = new Paciente(); // Contiene "Vista Previa Mensaje"
	}

	public Enfermero getEnfermero() {
		return enfermero;
	}

	public Paciente getPaciente() {
		return paciente;
	}

	public Electrocardiograma getElectro() {
		return electro;
	}

	public void setEnfermero(Enfermero enfermero) {
		this.enfermero = enfermero;
	}

	public void setPaciente(Paciente paciente) {
		this.paciente = paciente;
	}

	public void setElectro(Electrocardiograma electro) {
		this.electro = electro;
	}

	public byte[] toByte() throws IOException {
		ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
		DataOutputStream out = new DataOutputStream(byteStream);

		byte[] msj_base_data = super.toByte();
		out.write(msj_base_data);

		// Datos enfermero
		out.writeInt(enfermero.getId());

		// Datos Paciente
		out.writeUTF(paciente.getNombre());
		out.writeUTF(paciente.getApellido());
		out.writeInt(paciente.getDNI());
		out.writeInt(paciente.getEdad());
		out.writeUTF(paciente.getSexo());

		out.writeFloat(paciente.getTemperatura()); // Temp
		out.writeInt(paciente.getPresion_sistolica()); // Sistolica
		out.writeInt(paciente.getPresion_distolica()); // Diastolica
		out.writeInt(paciente.getFrecuencia_resp()); // Frecuencia Respiratoria
		out.writeInt(paciente.getPpm()); // PPM
		out.writeInt(paciente.getGlucosa_en_sangre());
		out.writeInt(paciente.getOxigeno_en_sangre());

		// Electrocardiograma u otros estudios
		int c_tomas = electro.cant_tomas();
		int c_muestras = 0;
		for (int x = 0; x < c_tomas; x++) {
			Toma toma = electro.da_toma(x);
			c_muestras = toma.cant_muestras();
			out.writeInt(c_muestras);

			int mues;

			for (int i = 0; i < c_muestras; i++) {
				mues = toma.da_muestra(i).getMedicion();
				out.writeInt(mues);
			}
		}

		out.flush();
		out.close();

		return byteStream.toByteArray();
	}

	public static MensajeDatos fromByte(byte[] input) throws IOException,
			MsjNotForMeException {
		ByteArrayInputStream bs = new ByteArrayInputStream(input);
		DataInputStream in = new DataInputStream(bs);
		MensajeDatos msj = new MensajeDatos();

		String string_verif = in.readUTF();
		if (!string_verif.equals("SAER"))
			throw new MsjNotForMeException();

		in.readUTF(); // Lee el tipo, pero no hago nada
		msj.setIDmensaje(in.readInt()); // ID msj
		msj.setIDorigen(in.readInt()); // ID org
		msj.setIDdestino(in.readInt()); // ID dest
		msj.setCuerpo(in.readUTF());

		// Datos enfermero
		msj.getEnfermero().setId(in.readInt());

		// Datos Paciente
		msj.getPaciente().setNombre(in.readUTF());
		msj.getPaciente().setApellido(in.readUTF());
		msj.getPaciente().setDNI(in.readInt());
		msj.getPaciente().setEdad(in.readInt());
		msj.getPaciente().setSexo(in.readUTF());

		msj.getPaciente().setTemperatura(in.readFloat()); // Temp
		msj.getPaciente().setPresion_sistolica(in.readInt()); // Sistolica
		msj.getPaciente().setPresion_distolica(in.readInt()); // Diastolica
		msj.getPaciente().setFrecuencia_resp(in.readInt());
		msj.getPaciente().setPpm(in.readInt());
		msj.getPaciente().setGlucosa_en_sangre(in.readInt());
		msj.getPaciente().setOxigeno_en_sangre(in.readInt());

		// Electrocardiograma
		Electrocardiograma e = new Electrocardiograma();

		// Toma 1
		Toma toma = new Toma();
		int c_muestras = in.readInt();
		int muestra = 0;

		for (int i = 0; i < c_muestras; i++) {
			muestra = in.readInt();
			toma.agregar_muestra(new Muestra(muestra));
		}
		e.agregar_toma(toma);

		// Toma 2
		toma = new Toma();
		c_muestras = in.readInt();
		muestra = 0;

		for (int i = 0; i < c_muestras; i++) {
			muestra = in.readInt();
			toma.agregar_muestra(new Muestra(muestra));
		}
		e.agregar_toma(toma);

		// Toma 3
		toma = new Toma();
		c_muestras = in.readInt();
		muestra = 0;

		for (int i = 0; i < c_muestras; i++) {
			muestra = in.readInt();
			toma.agregar_muestra(new Muestra(muestra));
		}
		e.agregar_toma(toma);

		msj.setElectro(e);

		return msj;
	}

}
